package yz.mr.wordcount;
/**
 * 在自定义的Mapper类中要实现Map阶段的数据处理逻辑，并且需要继承，MapReduce，Mapper类
 * Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT> 父类中，存在四个泛型需要手动指定其类型
 * KEYIN, VALUEIN, --> 表示输入数据的key已经value对应的类型，经过之前的分析，key代表的是偏移量（数据获取的位置，一般是long）
 *                                                                  value代表的是文本文件的一行数据，用字符串来表示
 * 由于MapReduce有自己的数据结构，不能直接使用java的数据结构，在继承的泛型中不能使用java的数据结构，但是在函数中可以使用
 * 根据MapReduce的映射可以得到：
 *        MapReduce     java
 *        LongWritable   Long
 *        Text          String
 *        IntWritable    int
 *
 *        KEYOUT, VALUEOUT  =>根据WordCount分析，最终得到的结果是：
 *          key  单词                 value  标记值  1
 *          字符串 Text        数值类型   IntWritable
 *
 * 需要重写父类的map函数，并在Map中实现自己的数据处理逻辑
 */

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

public class WordCountMap extends Mapper<LongWritable, Text,Text, IntWritable> {

    /**
     *
     * @param key   代表的是偏移量
     * @param value  代表的是文本文件的一行数据
     * @param context  代表上下文对象，连接Map和Reduce的主线
     * @throws IOException
     * @throws InterruptedException
     */
    @Override
    protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context) throws IOException, InterruptedException {
        String[] words = value.toString().split(" ");

        for (String word : words) {
            //根据输出类型的要求。要将数据进行类型转化
            Text outKey = new Text(word);  //这样就将String类型转换成了MapReduce中的Text的类型

            IntWritable outValue = new IntWritable(1);

            //write函数是将数据写出到磁盘，之后提供给Reduce阶段进行数据拉取
            context.write(outKey,outValue);

        }

    }
}
